vim9script noclear

# =========================
# 插件加载（默认配置目录，无需设置 packpath）
# 目录结构示例：
#   %USERPROFILE%\vimfiles\pack\bundles\opt\vim-lsp\
#   %USERPROFILE%\vimfiles\pack\bundles\opt\vim-lsp-settings\
# =========================
packadd vim-lsp
packadd vim-lsp-settings

# =========================
# Vim 内置自动补全
# =========================
# 开启“边输入边弹出”的自动补全
set autocomplete
# 若你的 Vim 带有 autocompletedelay，可解开并调整弹出延时（毫秒）
set autocompletedelay=200

# 传统补全源（字典/缓冲区等），与 LSP 并行参与候选
set cpt=.,o,k,w,b,u,t,i

# 弹出菜单行为：显示菜单、即使只有一个候选也显示、不自动选中第一项
set completeopt=menu,menuone,noselect

# 压缩提示信息，避免干扰
set shortmess+=c

# 菜单高度与提示体验
set pumheight=12
set pummaxwidth=80
set fillchars+=trunc:…
set belloff+=ctrlg

# 习惯用 <Tab>/<S-Tab> 在菜单中导航（保留你原先的键位）
inoremap <silent><expr> <Tab>   pumvisible() ? "\<C-n>" : "\<Tab>"
inoremap <silent><expr> <S-Tab> pumvisible() ? "\<C-p>" : "\<S-Tab>"

# =========================
# LSP：把 omnifunc 接到 vim-lsp（供内置自动补全使用）
# 以及常用的跳转/重命名/诊断映射
# =========================
augroup Lsp_OnAttach
  autocmd!
  autocmd FileType c,cpp,objc,objcpp call OnLspBuf()
  autocmd FileType go call OnLspBuf()
augroup END

def OnLspBuf()
  # 关键：让内置自动补全使用 LSP 补全
  setlocal omnifunc=lsp#complete
  # 可选：将 :tag 跳转交给 LSP
  setlocal tagfunc=lsp#tagfunc

  # 常用 LSP 映射（仅当前 buffer）
  nnoremap <buffer> gd         <Plug>(lsp-definition)
  nnoremap <buffer> gD         <Plug>(lsp-declaration)
  nnoremap <buffer> gr         <Plug>(lsp-references)
  nnoremap <buffer> gi         <Plug>(lsp-implementation)
  nnoremap <buffer> gt         <Plug>(lsp-type-definition)
  nnoremap <buffer> K          <Plug>(lsp-hover)
  nnoremap <buffer> <leader>rn <Plug>(lsp-rename)
  nnoremap <buffer> <leader>ca <Plug>(lsp-code-action)
  nnoremap <buffer> [d         <Plug>(lsp-previous-diagnostic)
  nnoremap <buffer> ]d         <Plug>(lsp-next-diagnostic)
enddef

# =========================
# 诊断显示与预览窗口细节（可按需调整）
# =========================
g:lsp_diagnostics_enabled = 1
g:lsp_diagnostics_virtual_text_enabled = 1
g:lsp_virtual_text_prefix = '● '
g:lsp_diagnostics_echo_cursor = 1

# 若补全时打开了 preview 窗口，完成后自动关闭
autocmd CompleteDone * silent! pclose

